package it.unisalento.appsalento.asynctask;

import it.unisalento.appsalento.constants.Constants;
import it.unisalento.appsalento.activity.App;
import it.unisalento.appsalento.activity.LoginActivity;
import it.unisalento.appsalento.activity.dialog.GenericDialog;
import it.unisalento.appsalento.asynctask.framework.AndroidServiceIteratorProvider;
import it.unisalento.appsalento.asynctask.framework.MIMETypes;
import it.unisalento.appsalento.bo.mock.MockBo;
import it.unisalento.appsalento.model.Utente;

import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.WeakReference;

import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.spi.service.ServiceFinder;

/**
 * <p>
 * <b>Description</b>: Classe che estende Async Task. Tale classe si occupa di verifica, tramite WS,la corretta
 * login dell'utente. Nel caso in cui la login sia andata a buon fine, i dati dell'utente verranno 
 * memorizzati all'interno dell'oggetto App.utente e verr�� lanciata la sincronizzazione del calendario e del Libretto
 * </p>
 * @author Alberto Gianfranco Meleleo
 * 
 */
public class UserLoginTask extends SyncAsyncTask {
	private WeakReference<LoginActivity> meinActivityWeakRef;
	private Intent intent;
	private boolean rimaniConnesso;
	public Dialog mdialog ;
	@SuppressWarnings("rawtypes")
	public UserLoginTask(Context context, LoginActivity main, Intent intent,
			boolean rimaniConnesso) {
		ServiceFinder.setIteratorProvider(new AndroidServiceIteratorProvider());
		this.context = context;
		this.intent = intent;
		this.rimaniConnesso = rimaniConnesso;
		this.meinActivityWeakRef = new WeakReference<LoginActivity>(main);
	}

	@Override
	protected void onPreExecute() {

	}

	@Override
	protected void onPostExecute(Void result) {
		super.onPostExecute(result);
		if (App.utente.isOk()) {
			if (rimaniConnesso) {
				context.getSharedPreferences(Constants.PREFS_NAME, Context.MODE_MULTI_PROCESS)
						.edit()
						.putString(Constants.PREF_USERNAME, App.utente.getUsername())
						.putString(Constants.PREF_PASSWORD, App.utente.getPassword())
						.commit();
			}
			NewsAsyncTask newsTask = new NewsAsyncTask(context, null);
			newsTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,
					(Void[]) null);
			CalendarAsyncTask calendarTask = new CalendarAsyncTask(context, null);
			calendarTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,
					(Void[]) null);
			LibrettoAsyncTask librettoTask = new LibrettoAsyncTask(context, null);
			librettoTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,
					(Void[]) null);
			context.startActivity(intent);
			meinActivityWeakRef.get().finish();
		}else{
			
			new GenericDialog(meinActivityWeakRef.get(), App.utente.getMessaggio(),Constants.TITLE_ERROR);
			App.utente = null;

		}
		
		
	}

//	@Override
//	protected Void doInBackground(Void... params) {
//		ObjectMapper mapper = new ObjectMapper();
//
//		setData(mapper);
//		
//		return null;
//	}

	public boolean setData(ObjectMapper mapper) throws JsonParseException, JsonMappingException, IOException {
		boolean retVal = false;
		Utente utente = null;
		String username =  App.utente.getUsername();
		String password = App.utente.getPassword();
		
			if (!Constants.MOCK_ENABLED) {
				//
				final Client client = Client.create();
			    final WebResource resource = client.resource(Constants.URL_REST + Constants.SERVICE_LOGIN);
				final ClientResponse response = resource.type(MIMETypes.APPLICATION_JSON.getName()).post(
						ClientResponse.class, gson.toJson(App.utente));
				if (response.getStatus() != 201 && response.getStatus() != 200) {
					return retVal ;
				}
				final String responseEntity = response.getEntity(String.class)
						.replaceAll("\\\\", "");
				utente = mapper.readValue(responseEntity, Utente.class);
			} else {
				InputStream is = context.getAssets().open(
						MockBo.CHECK_USER_RESPONSE);
				utente = mapper.readValue(is, Utente.class);
			}
			App.utente = utente;
			App.utente.setUsername(username);
			App.utente.setPassword(password);
		

		return retVal;
	}
}
